package io.openim.android.ouicore.base.vm.injection;

import android.widget.Toast;

import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModel;

import io.openim.android.ouicore.base.BaseApp;
import io.openim.android.ouicore.base.vm.ISubscribe;
import io.openim.android.ouicore.base.vm.State;
import io.openim.android.ouicore.base.vm.Subject;

//这是一个继承自ViewModel的Java类，主要实现了以下功能：
public class BaseVM extends ViewModel {
//    State 是一个类型，Subject 是 State 类型的泛型参数。channel 变量将用于存储 Subject 类型的状态信息。
    private final State<Subject> channel = new State<>();

//    toast方法用于显示Toast提示信息，通过BaseApp实例获取上下文并显示传入的content。
    public void toast(String content) {
        Toast.makeText(BaseApp.inst(), content, Toast.LENGTH_SHORT).show();
    }

    void removed() {
        onCleared();
    }

    protected void subject(String key) {
        channel.setValue(new Subject(key));
    }

    protected void subject(String key, Object value) {
        channel.setValue(new Subject(key, value));
    }

    protected void postSubject(String key) {
        channel.postValue(new Subject(key));
    }

    protected void postSubject(String key, Object value) {
        channel.postValue(new Subject(key, value));
    }
//    subscribe和subscribe方法用于订阅channel的状态更新，
//    可以指定LifecycleOwner，传入一个ISubscribe对象并在状态更新时调用其onSubject方法。
    public void subscribe(ISubscribe subscribe) {
        subscribe(null, subscribe);
    }

    public void subscribe(LifecycleOwner owner, ISubscribe subscribe) {
        if (null == owner)
            channel.observeForever(subscribe::onSubject);
        else
            channel.observe(owner, subscribe::onSubject);
    }
//    unSubscribe方法用于取消订阅，传入一个ISubscribe对象并移除其观察者。
    public void unSubscribe(ISubscribe subscribe) {
        channel.removeObserver(subscribe::onSubject);
    }

//    tag方法用于获取当前类的简单类名作为标签。
    protected  String tag(){
        return getClass().getSimpleName();
    }

}
